#include "tire.h"
#include "entity.h"


int son[TIRE_LEN][26] = {{0}};
CmdType cnt[TIRE_LEN];
int idx = 0;


/**
 * @brief 在tire树中插入一个字符串
 * 
*/
void insert(const char* str, int len, CmdType type){
    int ptr = 0;

    for (int i = 0; i < len; ++i) {
        int u = str[i] - 'a';
        // printf("str = %s, ptr = %d u = %d, i = %d\n", str, ptr, u, i);
        if (!son[ptr][u]) {
            son[ptr][u] = ++idx;
        }
        ptr = son[ptr][u];
    }
    cnt[ptr] = type;
}


/**
 * @brief 在tire树中查询
 * @return 返回对应的CmdType,不存在返回-1
*/
int query(const char* str, int len) {

    int ptr = 0;
    for(int i = 0; i < len; ++i) {
        int u = str[i] - 'a';
        if(!son[ptr][u]){
            return -1;
        }
        ptr = son[ptr][u];
    }
    return cnt[ptr];
}

/**
 * @brief 初始化tire树
 * 
*/ 
void initTire() {
    // -1的补码是全1，所以memset数组所有元素都变成了-1
    memset(cnt, -1, sizeof(cnt));

    insert("data", 4, DATA);
    insert("login", 5, LOGIN);
    insert("register", 8, REGISTER);
    insert("cd", 2, CD);
    insert("ls", 2, LS);
    insert("pwd", 3, PWD);
    insert("putfile", 7, PUT_FILE);
    insert("getfile", 7, GET_FILE);
    insert("rm", 2, RM);
    insert("mkdir", 5, MKDIR);
}
